package com.atguigu06.project.model.service;

import com.atguigu06.project.model.domain.Architect;
import com.atguigu06.project.model.domain.Designer;
import com.atguigu06.project.model.domain.Employee;
import com.atguigu06.project.model.domain.Programmer;

/**
 * ClassName: TeamService
 * Package: com.atguigu06.project.model.service
 * Description:
 * 关于开发团队成员的管理：添加、删除等。
 *
 * @Author ZY
 * @Create 15:20
 * @Version 1.0
 */
public class TeamService {

    private static int counter = 1;//给memberId进行自动赋值的基数

    private final int MAX_MEMBER = 5;//限制开发团队的人数

    private Programmer[] team = new Programmer[MAX_MEMBER];//保存开发团队成员数组

    private int total = 0;//记录开发团队中的实际人数

    /**
     * 返回当前团队的所有对象
     *
     * @return 数组大小与成员人数一致
     */
    public Programmer[] getTeam() {
        Programmer[] team = new Programmer[total];
        for (int i = 0; i < total; i++) {
            team[i] = this.team[i];
        }

        return team;
    }

    /**
     * 添加成员到团队
     *
     * @param e 待添加成员的对象
     * @throws TeamException :添加失败,异常中包含失败原因
     */
    public void addMember(Employee e) throws TeamException {
        //成员已满，无法添加
        if (total >= MAX_MEMBER) {
            throw new TeamException("成员已满，无法添加");
        }
        //该成员不是开发人员，无法添加
        if (!(e instanceof Programmer)) {
            throw new TeamException("该成员不是开发人员，无法添加");
        }

        //该员工已是某团队成员
        //该员工正在休假，无法添加
        Programmer p = (Programmer) e;//将 Employee 对象转换为具体的程序员对象（Programmer）
        Status status = p.getStatus();
        switch (status) {
            case BUSY:
                throw new TeamException("该员工已是某团队成员");
            case VOCATION:
                throw new TeamException("该员工正在休假，无法添加");
        }


        //该员工已在本开发团队中
        boolean isExost = isExist(p);
        if (isExost) {
            throw new TeamException("该员工已在本开发团队中");
        }

        //记录程序员、设计师、架构师的个数
        int ProgrammerNum = 0, ArchitectNum = 0, DesignerNum = 0;
        for (int i = 0; i < total; i++) {
            if (team[i] instanceof Architect) {
                ArchitectNum++;
            } else if (team[i] instanceof Designer) {
                DesignerNum++;
            } else {
                ProgrammerNum++;
            }
        }
//        团队中至多只能有一名架构师
        if (p instanceof Architect) {
            if (ArchitectNum >= 1) {
                throw new TeamException("团队中至多只能有一名架构师");
            }
        }
//         团队中至多只能有两名设计师
        else if (p instanceof Designer) {
            if (DesignerNum >= 2) {
                throw new TeamException("团队中至多只能有两名设计师");
            }
        }
//        团队中至多只能有三名程序员
        else {
            if (ProgrammerNum >= 3) {
                throw new TeamException("团队中至多只能有三名程序员");
            }
        }

        //满足条件，将指定员工对象添加到团队（即p可以添加到team数组中）
        team[total++] = p;
        p.setMemberId(counter++);
        p.setStatus(Status.BUSY);

    }


    /**
     * 判断p是否存在于当前的开发团队中
     *
     * @param p
     * @return
     */
    private boolean isExist(Programmer p) {
        for (int i = 0; i < total; i++) {
            if (team[i].getId() == p.getId())
                return true;
        }
        return false;
    }

    /**
     * 根据成员id从团队中删除成员
     *
     * @param memberId 待删除成员的id
     * @throws TeamException :找不到指定id的成员,异常中包含失败原因
     */
    public void removeMember(int memberId) throws TeamException {
        int i = 0;
        for (; i < total; i++) {

            if (team[i].getMemberId() == memberId) {
                //找到了指定id的员工,同时调整其相关属性、状态
                team[i].setStatus(Status.FREE);
                //员工的memberId可以不修改。
                break;
            }

        }
        //没找到
        if (i == total) {
            throw new TeamException("找不到指定id的员工,删除失败");
        }

        //找到& 调整数组
        for (int j = i; j < total; j++) {
            team[j] = team[j + 1];

        }
//        team[total - 1] =null;
//        total--;
        //合并
        team[--total] = null;

    }


}
